package com.shp.utils;

import com.shp.pojo.User;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Description:
 * 权限拦截器，用户是否登录，访问购物车,发布商品和个人中心
 * @author zwl
 * @version 1.0
 * @date 2020/3/5 14:28
 */
public class PowerInterceptor implements HandlerInterceptor {
    /**
     * preHandle方法是进行处理器拦截用的，顾名思义，该方法将在Controller处理之前进行调用，
     * SpringMVC中的Interceptor拦截器是链式的，可以同时存在多个Interceptor，
     * 然后SpringMVC会根据声明的前后顺序一个接一个的执行，
     * 而且所有的Interceptor中的preHandle方法都会在Controller方法调用之前调用。
     * SpringMVC的这种Interceptor链式结构也是可以进行中断的，
     * 这种中断方式是令preHandle的返回值为false，当preHandle的返回值为false的时候整个请求就结束了。
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        System.out.println("++++++++++++++++++++++++++：PowerInterceptor +  : " );
        // 获取session
        HttpSession session = request.getSession();
        // 获取用户
        User activeUser = (User)session.getAttribute("activeUser");
        if(activeUser != null){
            // 如果用户已经登陆，放行
            return true;
        }

        // 没有登录，转发到登录页面
        // 获取虚拟路径
        String basePath = request.getServletContext().getAttribute("basePath").toString();
        System.out.println("++++++++++++++++++++++++++：" + request.getRequestURI());
        // 重定向到登陆页面
        response.sendRedirect(request.getContextPath() + "/login");
        return false;
        // String uri = request.getRequestURI();
        // System.out.println(uri);
        // if (uri.contains("/user/space") || uri.contains("/goods/publishGoods")) {
        //     request.getRequestDispatcher("../pages/login.jsp").forward(request,response);
        //     return false;
        // }else if(uri.contains("/shopcart")){
        //     request.getRequestDispatcher("pages/login.jsp").forward(request,response);
        //     return false;
        // }else{
        //     return false;
        // }
    }

    /**
     * 这个方法只会在当前这个Interceptor的preHandle方法返回值为true的时候才会执行。
     * postHandle是进行处理器拦截用的，它的执行时间是在处理器进行处理之 后， 也就是在Controller的方法调用之后执行，
     * 但是它会在DispatcherServlet进行视图的渲染之前执行，也就是说在这个方法中你可以对ModelAndView进行操作。
     * 这个方法的链式结构跟正常访问的方向是相反的，也就是说先声明的Interceptor拦截器该方法反而会后调用，
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }

    /**
     * 该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行。
     * 该方法将在整个请求完成之后，也就是DispatcherServlet渲染了视图执行，
     * 这个方法的主要作用是用于清理资源的，
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }
}
